# -*- coding:utf-8 -*-

import os, sys

class AutoIt():
    """
    Classe permettant de gérer les fenêtres Satel et MotionDevTool en arrière-plan, et de leur envoyer les messages nécessaires
    (clic bouton, remplissage de champ...)
    """
    def __init__(self):
        """
        Constructeur de la classe. S'enregistre auprès de AutoIt s'il est présent, lève une erreur sinon
        """
        # Import du client Win32 COM
        try:
            import win32com.client
        except ImportError:
            raise(ImportError, 'Ce programme requiert pywin32. Voir http://starship.python.net/crew/mhammond/win32/')
        
        import pywintypes # pour gérer les erreurs COM.
        
        # Import AutoIt
        self.autoit = None
        try:
            self.autoit = win32com.client.Dispatch("AutoItX3.Control")
            self.autoit.AutoItSetOption("WinTitleMatchMode", 4)
        except pywintypes.com_error:
            # Si on ne peut pas instancier, on essaye d'enregistrer le COM une nouvelle fois
            os.system("regsvr32 /s AutoItX3.dll")
           
        # Import AutoIT (deuxième essai si nécessaire)
        if not self.autoit:
            try:
                self.autoit = win32com.client.Dispatch("AutoItX3.Control")
            except pywintypes.com_error:
                raise(ImportError, "Impossible d'instancier le module AutoIt COM car : ", e)
           
        if not self.autoit:
            print "Impossible d'instancier le module AutoIt COM"
            sys.exit(1)
            
            
    def lancerAcquisitionPlateforme(self):
        """
        Lance l'acquisition des données sur la plateforme
        Retourne :
            - 1 si la commande a marché
            - un message d'erreur sinon
        """
        resultat = self.autoit.ControlClick("[CLASS:TFcaliboffls]", "", "[CLASS:TButton; INSTANCE:2]")
        # si on arrive pas à lancer l'acquisition
        if not resultat:
            resultat = "Impossible de lancer l'acquisition de la plateforme. Assurez vous que vous êtes bien sur la fenêtre d'acquisition"
        return resultat
        
    def enregistrerDonneesPlateformeDansBD(self):
        """
            Enregistre les donnees dans la base de données
        """
        # clic sur le bouton enregistrer
        self.autoit.ControlClick("[CLASS:TResult]", "", "[CLASS:TBitBtn; INSTANCE:2]")
        # êtes-vous sûr ?
        self.autoit.WinWait("[CLASS:TMessageForm]")
        self.autoit.ControlClick("[CLASS:TMessageForm]", "", "[CLASS:TButton; INSTANCE:2]")
        # clic sur le bouton de retour
        self.autoit.ControlClick("[CLASS:TFcaliboffls]", "", "[CLASS:TBitBtn]")
        
        
    def activerTimestampAccelerometres(self):
        """
        Active l'enregistrement des timestamp et de la date de départ des accéléromètres
        """
        self.autoit.ControlSend("MotionDevTool", "", "[CLASS:Button; INSTANCE:17]", "{+}")
        self.autoit.ControlSend("MotionDevTool", "", "[CLASS:Button; INSTANCE:18]", "{+}")
        
        
    
    def toggleAcquisitionAccelerometres(self):
        """
        Lance ou arrete l'acquisition des données des accéléromètres en fonction de l'état précédent
        Retourne :
            - 1 si la commande a marché
            - un message d'erreur sinon
        """
        resultat = self.autoit.ControlClick("MotionDevTool", "", "[CLASS:Button; INSTANCE:24]")
        if not resultat:
            resultat = "Problème dans l'acquisition des accéléromètres."
        return resultat
    
    
    def setCheminSortieAccelerometres(self, chemin, prefixe=""):
        """
        Modifie le chemin où seront enregistrées les données des accéléromètres
        Arguments :
            - chemin : le chemin du dossier
            - prefixe : le préfixe du nom (contenant l'heure par exemple)
        """
        self.autoit.ControlSend("MotionDevTool", "", "[CLASS:Edit; INSTANCE:3]", "{HOME}{SHIFTDOWN}{END}{SHIFTUP}" + chemin + prefixe + "accelero.txt")
        
    
    def exporterResultats(self, chemin, prefixe=""):
        """
        Exporte les résultats nécessaires pour la plateforme
        Arguments :
            - prefixe : un préfixe à rajouter au chemin si besoin
        Retourne :
            - un tuple contenant le chemin complet d'enregistrement des infos de la plateforme et des données
        """
        ##### données calculées #####
        # clic sur le bouton "Exporter"
        self.autoit.ControlClick("[CLASS:TMain]", "", "[CLASS:TButton; INSTANCE:4]")
        self.autoit.WinWait("[Class:TFormExport]")
        # clic "enregistrement sélectionné seulement"
        self.autoit.ControlClick("[CLASS:TFormExport]", "", "[CLASS:TRadioButton; INSTANCE:4]")
        # clic "ok"
        self.autoit.ControlClick("[CLASS:TFormExport]", "", "[CLASS:TBitBtn; INSTANCE:2]")
        # on remplit le chemin et on valide
        self.autoit.WinWaitActive("[CLASS:#32770]")
        self.autoit.send(chemin + prefixe + "plateforme_info{ENTER}")
        
        ##### données capteurs #####
        self.autoit.WinWaitActive("[Class:TMain]")
        # clic sur le bouton "Exporter"
        self.autoit.ControlClick("[CLASS:TMain]", "", "[CLASS:TButton; INSTANCE:4]")
        self.autoit.WinWait("[Class:TFormExport]")
        # clic sur "enregistrement sélectionné seulement"
        self.autoit.ControlClick("[CLASS:TFormExport]", "", "[CLASS:TRadioButton; INSTANCE:4]")
        # clic sur "Les données capteurs"
        self.autoit.ControlClick("[CLASS:TFormExport]", "", "[CLASS:TRadioButton; INSTANCE:2]")
        # clic "ok"
        self.autoit.ControlClick("[CLASS:TFormExport]", "", "[CLASS:TBitBtn; INSTANCE:2]")
        # on remplit le chemin et on valide
        self.autoit.WinWaitActive("[CLASS:#32770]")
        self.autoit.send(chemin + prefixe + "plateforme_donnees{ENTER}")
        
    

if __name__ == "__main__":
    autoit = AutoIt()
    autoit.lancerAcquisitionPlateforme()
#    autoit.activerTimestampAccelerometres()
#    print autoit.toggleAcquisitionAccelerometres()
    raw_input("appuyez sur Enter une fois l'acquisition terminée")
#    print autoit.toggleAcquisitionAccelerometres()
    autoit.enregistrerDonneesPlateformeDansBD()
    autoit.exporterResultats("D:\\luc\\stage\\data\\")
    autoit.setCheminSortieAccelerometres("D:\\luc\\stage\\data\\")
